package com.example.roleplay.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * WebSocket消息DTO
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WebSocketMessage {
    
    /**
     * 消息类型
     */
    private MessageType type;
    
    /**
     * 消息内容
     */
    private String content;
    
    /**
     * 文本内容（当type为user_text或partial_text时）
     */
    private String text;
    
    /**
     * 音频数据（Base64编码，当type为user_audio或audio_chunk时）
     */
    private String data;
    
    /**
     * 音频格式（如wav, mp3）
     */
    private String format;
    
    /**
     * 增量文本（用于流式输出）
     */
    private String delta;
    
    /**
     * 会话ID
     */
    private String sessionId;
    
    /**
     * 时间戳
     */
    private long timestamp;

    /**
     * 消息类型枚举
     */
    public enum MessageType {
        // 客户端发送的消息类型
        USER_TEXT,      // 用户文本消息
        USER_AUDIO,     // 用户音频消息
        
        // 服务端发送的消息类型
        PARTIAL_TEXT,   // 流式文本片段
        FINAL_TEXT,     // 最终完整文本
        AUDIO_CHUNK,    // 音频片段
        ERROR,          // 错误消息
        STATUS,         // 状态消息
        
        // 控制消息
        PING,           // 心跳检测
        PONG            // 心跳响应
    }

    /**
     * 创建用户文本消息
     */
    public static WebSocketMessage userText(String text, String sessionId) {
        return WebSocketMessage.builder()
                .type(MessageType.USER_TEXT)
                .text(text)
                .sessionId(sessionId)
                .timestamp(System.currentTimeMillis())
                .build();
    }

    /**
     * 创建用户音频消息
     */
    public static WebSocketMessage userAudio(String audioData, String format, String sessionId) {
        return WebSocketMessage.builder()
                .type(MessageType.USER_AUDIO)
                .data(audioData)
                .format(format)
                .sessionId(sessionId)
                .timestamp(System.currentTimeMillis())
                .build();
    }

    /**
     * 创建流式文本消息
     */
    public static WebSocketMessage partialText(String delta) {
        return WebSocketMessage.builder()
                .type(MessageType.PARTIAL_TEXT)
                .delta(delta)
                .timestamp(System.currentTimeMillis())
                .build();
    }

    /**
     * 创建最终文本消息
     */
    public static WebSocketMessage finalText(String text) {
        return WebSocketMessage.builder()
                .type(MessageType.FINAL_TEXT)
                .text(text)
                .timestamp(System.currentTimeMillis())
                .build();
    }

    /**
     * 创建音频块消息
     */
    public static WebSocketMessage audioChunk(String audioData, String format) {
        return WebSocketMessage.builder()
                .type(MessageType.AUDIO_CHUNK)
                .data(audioData)
                .format(format)
                .timestamp(System.currentTimeMillis())
                .build();
    }

    /**
     * 创建错误消息
     */
    public static WebSocketMessage error(String message) {
        return WebSocketMessage.builder()
                .type(MessageType.ERROR)
                .content(message)
                .timestamp(System.currentTimeMillis())
                .build();
    }
}